CP/M ON THE C128 (ARTICLE 1)

by Noel Nyman

[Edited by Gary J. Stagliano]

(Copyright 1986 by Geoduck Developmental Systems. Permission
to reprint this material is hereby granted, provided this
notice is included in the reprinted material.) [These articles
originally appeared in a Canadian magizine called INPUT]

In this column we plan to explore CP/M (Control Program for
Microcomputers) and how to use it on the C128.  

To understand the what and why of CP/M, we have to go back
to the early days of microcomputing.  In this primitive time
there were mainframes, huge and expensive computers.
Communicating with one required a "console" which had a
keyboard and an output device.  The output was frequently a
printer, although the cathode ray tube (CRT or tv screen)
was becoming more common. Refurbished teletype machines were
often used as consoles.

In the early 1970's a revolution began that would change the
course of computing...the LSI (Large Scale Integration)
micro chip.  It became possible to produce on a single piece
of silicon all the logic in CPU's (Central Processing Units)
requiring several circuit boards on the mainframes.  The
first popular microprocessor chip, the 8080 designed by
Intel, was used to make intelligent terminals.  These were
consoles that contained a keyboard and CRT monitor, a small
amount of RAM (Random Access Memory) and some means of
communicating with a mainframe.

The large hard disks and tape drives used by the main frames
were too complex for a microcomputer to control (there
wasn't enough RAM to hold the controller program required).
So the micros used paper tape. A punch poked rows of up to
seven holes in the half-inch wide tape, each hole
representing a bit in a seven bit character or command.  A
paper tape reader translated these holes into binary data to
store in the micro.  Storing a program was noisy and slow.

In 1973 IBM developed the first floppy disks as alternatives
to the then popular punch cards used on mainframes.  Gary
Kildall at Intel obtained a used drive from a small company
named Shugart and began working on a controller program to
interface it with an 8080 based microcomputer.  He and John
Torode developed the controller into a full disk drive
operating system, which they called CP/M.  Intel wasn't much
interested in the project, and Kildall and Torode began
marketing the product on their own through Digital Research
in 1976. The rest, as they say, is history.

CP/M is an operating system.  Every computer needs an
operating system in order to interface with the console, the
disk drives, and any other peripherals such as modems and
printers.  In the relatively advanced age we live in, home
computers usually come with their operating systems in ROM
(Read Only Memory). When you power up your C128, it "knows"
how to talk to the keyboard, screen, etc.  The Commodore
disk drives have their operating systems in ROM also.  You
don't need to LOAD any program in order to type on the
keyboard, print characters on the screen, or find a file on
a floppy disk.

In 1973 computers were much less smart. Partly this was due
to the high costs of both RAM and ROM. A 32K machine cost in
excess of $3000 without peripherals (1973 dollars, gasoline
was still under $0.20 a litre then).  ROM was very expensive
and difficult to program, EPROM's (Erasable Programmable
Read Only Memory) weren't available.

Each time you turned the power on, you had to teach the
computer how to be a computer all over again.  You did that
by writing a program called the operating system, and
SAVEing on disk or paper tape.  You used another smaller
program that often was typed in by hand each time to LOAD
the larger program.  This method of using a program to LOAD
other programs was called "bootstrapping" since the
computer was in a sense lifting itself by its own
bootstraps.  The idea of "BOOTing" an operating system
remains with us, and is a command recognized by Basic 7.0.

CP/M provided a standardized operating environment on many
different computers.  For example, the TRS-80 machines use
the command LPRINT to send strings to a printer.  Commodore
uses PRINT# followed by a file number. But any printer
routine written on a machine running under CP/M will run on
any other CP/M machine (I'm not sure why "running under" is
used, but that's the proper term).

CP/M comes in four main sections.  The first is the LOADing
routine, which is usually on reserved tracks on CP/M disks.
On the C128, the LOADer is found in ROM.  The two workhorses
of CP/M are the BDOS (Basic Disk Operating System) and the
BIOS (Basic Input-Output System).  Note that the term
"Basic" as used here is a synonym for "primary" or
"essential" and does not refer to the BASIC programming
language.

The BDOS is identical for all CP/M systems of the same
version.  BDOS works much like the Kernal jump table in
Commodore machines, providing access to the routines for
opening disk files, printing strings, and such by simply
calling them by number.  The BIOS is customized for each
computer model.  When the BDOS is asked to open a file, it
uses several BIOS routines which are customized for the disk
drives, data buss structure, etc.

The last section is a program call CCP (Console Command
Processor).  The CCP accepts input from the keyboard,
displays it on the screen, and places it in memory where
appropriate for execution by other programs.  On most
systems the CCP must be reLOADed after other programs finish
execution.  On the C128, the CCP is always resident.

There have been several versions of CP/M produced since
1973.  The C128 runs under CP/M 3.0 (sometimes called
CP/M+).  This is the most advanced CP/M available, used
computers with bank switching capability and over 64K of RAM
can use it.

If you'd like to read more about CP/M, there are many books
available.  Since it's a relatively old system, your library
may be a good source of information.  Try to get material
for CP/M+, since some commands for older CP/M versions are
different.  Some good references are:

THE CP/M PLUS HANDBOOK, Alan R. Miller, Sybex

CP/M AND THE PERSONAL COMPUTER, Dwyer & Critchfield,
Addison-Wesley

If the date on the screen when you BOOT CP/M is older than
December 4, 1985, you should get a copy of the new operating
system.  This is available from CompuServe, Q-Link, 
or perhaps a user in your area has one.

[Ed. Note-The latest version of CP/M+ for the C128 is the
May 87 version.  This version supports the 790K 1581 3.5"
drive.  It also supports external terminals and true 6551 
UART chip for improved RS232 communications.  It also has
an experimental 4.0 Mz mode that works on some C128.]

----Some additional references----

DR DOBB'S JOURNAL, especially earlier issues, covers CP/M
extensively, you local library may have past issues
available.  For an interesting article by Gary Kildall on
the start of CP/M, see the January 1980 issue.

Old copies of BYTE, KILOBAUD MICROCOMPUTING, and INTERFACE
AGE also have articles on CP/M.  For a series on CP/M+,
check the February 1983 issue of MICROSYSTEMS.

The C128 HSG: c/o Gary J. Stagliano 182-J Homestead St.
has an extensive collection of CP/M software for the C128.

The Dwyer & Critchfield book above has excellent reference
sections on programming under CP/M in Z80 and 8080 machine
code.  For more details on Z80, try:

    Z80 ASSEMBLY LANGUAGE PROGRAMMING
    Lance Leventhal
    Osborne/McGraw-Hill

    Z80 ASSEMBLY LANGUAGE ROUTINES
    Leventhal and Saville
    Osborne/McGraw-Hill

Before we look at how to work with CP/M, it's important to
understand what CP/M isn't.

CP/M is NOT a programming language.  Commodore operating
systems rely heavily on the BASIC programming language ROM
to communicate with the user.  CP/M has no high level
language in it.  To program in BASIC, you must LOAD a BASIC
language into the computer.

CP/M does NOT contain a word processor, data base, or any
other sophisticated programs.  It is only an operating
system.  It gives you the ability to LOAD other programs and
utilities, to view disk directories and text files, and to
rename or erase disk files.  It combines some of the
features of the Commodore DOS 5.1 wedge and a sequential
file reading program.  It also gives programs written in
8080 or Z80 microprocessor machine code a universal way to
access the screen, keyboard, disk drives, printer, and
modem.  Most of these programs will run on the C128, even
though they were written many years ago on different
machines running under an earlier version of CP/M.

To start or BOOT CP/M on the C128, place the "system" disk
(the disk that has the CP/M operating system on it) in your
disk drive and turn on the computer or reset it with the
reset button next to the power switch.  If you are in C128
mode, you can type the command BOOT instead.

The older CP/M operating systems supplied with the C128 used
either the forty or eighty column screens.  The systems
dated December 4th and later use only eighty columns.  To
use CP/M effectively, you should be using the newest
version.  This will require an eighty column monitor.

You can use an RGBI monitor, such as the 1902, simply by
plugging in the 9 pin connecting cable.  You can have
excellent eighty column video at much lower cost by using a
monochrome monitor.  Some are even available with audio
amplifiers, for under $100.  You can also use a 1702 monitor
for monochrome with lower resolution.

To use a 1702 or monochrome monitor, you'll need a cable
with an RCA type phono plug on one end and a DB-9 connector
on the other.  You can make one (connect the center of the
RCA plug to pin 7 and the shield to pin 1 of the DB-9), or
purchase one ready made.  Check with your local dealer, or
the ads in Commodore oriented magazines.

Once you BOOT CP/M, you'll see the opening message with the
date and finally

A>

with a flashing cursor behind it.  This is the user prompt,
the CP/M equivalent of Commodore's "READY".  CP/M is
awaiting your command.

The tasks that CP/M can be told to perform in direct mode
are called "utilities".  Six of these utilities are called
"resident" because they are a permanent part of CP/M as it
sits in the C128's RAM.  All other utilities are
"transient", they must be LOADed from disk into memory and
executed, just like a program.

To execute a utility, just type its name at the system
prompt.  For example, type the following:

A> dir

and press RETURN.  The disk drive will spin briefly and
you'll see the names of the files on the disk in drive A.
CP/M uses letters to identify drives, where Commodore uses
numbers.  The C128 CP/M system supports four disk drives,
plus a ram drive. The defaults are:

       A=8   B=9   C=10   D=11    M=Ram

These can be changed, as we'll see later.  If you only have
one disk drive, the CP/M system will let you use drive E as
a "virtual" drive.  Drive E doesn't exist, but when you
refer to it, CP/M will use available RAM in place of a
drive, or prompt you to put the "E" disk in drive A.  You'll
use drive E to hold files when copying, much as the program
1541 BACKUP uses the C64 RAM to hold files when copying
disks on a single drive.

Each file listed on the directory has two parts, the name
and the extension.  For the program CPM+, the extension is
SYS.  The name and extension together are called the
"filespec".  Files on a CP/M disk can have as many as eight
characters in their file names and up to three character
extensions.  Although the "dir" command shows the file names
and extensions separated by spaces on your screen, you'll
enter filespecs by separating the name and extension with a
"."  as in

     CPM+.SYS

Since CP/M uses the "." to tell where the name ends and the
extension begins, don't use a "." as part of the file name.
In fact, it's best to avoid any characters in file names
except letters and numbers.

You can use any extension you like when naming or renaming a
file.  Some of the extensions have special meaning to CP/M
or some utilities.  But unlike the Commodore DOS, CP/M will
let you rename any program, including its extension, at any
time.

The most important extension for now is ".COM".  Files with
this extension are "command" files.  They are Z80 or 8080
machine language programs.  Usually they are self starting.
To "RUN" a command file, simply type its name at the system
prompt.  Do NOT type the ".COM" extension.  There is [in 
public domain] a simple card game called TWENTY1.COM.  Try
the game now by typing:

A> twenty1

The disk drive will spin, the program will be LOADed and RUN
automatically.  To end the game at any time hold the CONTROL
key and press the "C" key.  This is the CP/M equivalent of
RUN/STOP-RESTORE plus SYS 64738, and is usually abbreviated
CTRL-C or sometimes shown as an "up-arrow C" in texts that
can print an up-arrow symbol.

If you have a second disk drive, you can LOAD programs or
other files from it in one of two ways.  First try

A> b:twenty1

If you forgot to move the disk to drive B, you'll get a
"TWENTY1?" from CP/M, which is asking you if that's really
what you meant to type.  With the disk in drive B, the
program will LOAD and RUN.  Use CTRL-C to exit, and type

A> b:

and you should see

B>

To change the system or "default" drive at any time, simply
type the new drive number at the system prompt.  Don't
forget the colon, or CP/M will look for a file named "B.COM"
on drive A.

With the system drive changed to B, you can enter the name
of any ".COM" file on the disk in that drive without
including the drive as part of the filespec.


Before we discuss more resident utilities, let's look at
using disk drives with the C128 in CP/M mode.  The 1571
drive which was designed to work with the C128 will read
regular 1541 type disks and also the MFM type disks used by
many 5 1/4 inch CP/M disk machines.  This has led to some
confusion about just what a "CP/M" disk is.

Commodore uses a process called GCR (Group Character
Recognition) to record data on its disks.  GCR describes the
way in which the disk electrical system works.  It does not
have anything to do with the number of tracks or sectors, or
their placement on the disk.  Apple also uses a form of GCR,
but their track layout is quite different.

When a disk is formatted on a 1541, the DOS (Disk Operating
System) puts 35 tracks on the disk containing 664 sectors.
A 1571 uses exactly the same layout on the "front" of the
disk, then repeats it on the "back", for a total of 70
tracks and 1328 sectors.

When you format a disk using the CP/M utility "FORMAT.COM",
the layout of the tracks and sectors is IDENTICAL to that
used in the standard 1541 or 1571.  The CP/M disk has its
directory area on different tracks and places a BOOT sector
on each formatted disk, but the layout is the same.  You can
prove this by examining a Commodore CP/M disk in C64 mode
with a "disk doctor" program.

This means that you can use any combination of 1541's and
1571's in a C128 CP/M system.  The CP/M disk that came with
your C128 is a single sided (1541) disk.  You can read it
with either disk drive.  You must turn it over to read the
"back" side.  You can also copy a single sided (1541) CP/M
disk with any "bit" copier or with the backup command on a
dual drive such as the MSD.

However, CP/M is NOT practical with a single 1541 disk
drive.  It's just too slow.  If you want to learn about the
CP/M system, or experiment with some of the programs, the
speed will be tolerable.  But any serious programming,
database or word processor work will take too long.  You are
much better off with existing C64 programs for those tasks.
Using one of the many "fast load" programs or cartridges
will make a C64 system much faster and easier to use than a
1541 CP/M system.

If you have a 1571, you can use a 1541 as the "B" drive with
better results.  The disk operations will still be slow on
the 1541.  But you can do your primary work with the faster
drive.

If you are contemplating the purchase of a C128 and two
1571's JUST to run CP/M, I advise against it.  For the same
money you could purchase a low end or used CP/M computer
such as a Kaypro which will run CP/M many times faster than
a C128.  However, for the combination of a fantastic Basic,
excellent sound and graphics, C64 compatibility (mostly) and
 CP/M as frosting on the cake, the C128/1571 system is a
good bargain.

Last time we used the "DIR" resident utility to look at a
disk directory.  Enter the command again, and look at the
bottom of the listing.  If your boot disk is in your
drive, you'll see the phrase "System file(s) exist".  Now
enter the command

A> dirsys

You should see only the file "CCP.COM" followed by the
phrase "Non-system file(s) exist".

The term "system" refers to an "attribute" or characteristic
given to certain files.  It does NOT refer to the extension
".SYS".  Notice that the file "CPM+.SYS" appears when you
used the "DIR" command, but is not listed with "DIRSYS".

The system attribute is important for hard disk or
multi-user systems.  We'll look at it more closely when we
discuss the "USER" command.  But system files are also less
likely to be accidentally erased.  To erase a system file,
you must use a special command.  So it makes sense to
protect your most valuable files in this way.  We'll use a
utility called "SET.COM" to change "CPM+.SYS" to a system
file.

Place the original CP/M disk you received with your C128 in
drive A and use "DIR" to be sure you have the side
containing "SET.COM".  Then if you have two disk drives,
place the a disk with the cpm+.sys in drive B and type:

A> set b:cpm+.sys[system]

Don't leave a space between the ".sys" and the left bracket.
 Be sure to use brackets, shifted ":" and ";".  If you  have
only one drive, type:

A> set e:cpm+.sys[system]

In either case, CP/M will LOAD the program "SET.COM" from
the disk in drive A.  For a two drives, CP/M will then
change the attribute of the file on the disk in drive B.
For one drive, CP/M will prompt you to place the "E" disk in
drive A, and then changes the attribute.

Now use "DIR" and "DIRSYS" to check your work.  "SET.COM"
has many other uses we'll look at later.

USER is a utility that was designed for systems with hard
disk drives or multi-user systems.  It allows you to have
sixteen "user areas" on a single disk.  To illustrate this,
type:

A> user 5

Don't forget the space ahead of the number.  CP/M responds
with

5A>

The system will now only look at disk files that were SAVEd
to disk in the user 5 area.  When you type the DIR command,
you'll get a "no files" message because all the files on
your disk are in user 0.  The user number would be handy for
keeping your files separate from another user's on a hard
disk you both share.  It's not very useful to us, because
you can't access another user area files from the current
user area.  This means that any utilities are shut off from
you unless you copy them into the new user area. However,
when you type a file name, CP/M will look for a ".COM" file
with that name in the current user area.  If it doesn't find
one, it will look for the file in user 0, and LOAD it if it
has a "system attribute".  As we saw last time, the system
attribute is not the same as a ".SYS" extension.  If you
want utilities available in other user areas, use SET.COM to
change them to system attribute files.  Change back to user
0 now by typing:

5A> user 0

"ERASE" and "RENAME" are used to erase (scratch) or rename
files on a disk.  The commands can be abbreviated "ERA" and
"REN".  To change the name of the game TWENTY1.COM on a disk,
type:

 A> ren d:TWENTONE.COM=d:TWENTY1.COM

This is similar to the Commodore DOS format where the new
name comes first.  The "d:" represents the drive number
containing the disk with the file you want renamed.  You can
omit if if the file is on the currently logged drive.  Don't
use more than eight characters for the name and three for
the extension.  If you forget the extension, the file will
be named "TWENTONE.   ".  You can change any extensions at
any time, but some utilities expect certain extensions.
Avoid ".HEX", ".MAC", ".ASM", ".BAS", ".HLP" and ".COM" for
general files.  However, if you find a file on a public
domain disk with ".OBJ" (object code file), or ".BIN"
(binary code file), try changing the extension to ".COM" to
get the program to run under CP/M+.

The Commodore DOS wild card rules apply to CP/M as well.
You can use "?" as a single character wild card, or "*" as a
file name or extension wild card in most commands.  For
example

A> dir *.COM

will show you only the ".COM" files on the disk in drive A.
Using

A> ren d:*.bak=d:*.txt

changes all ".TXT" (text) files to ".BAK" (backup) on the
drive specified by "d:".  Typing

A> era *.*

will erase ALL the file on drive A...be careful!  If you use
a wild card in ERA or REN, CP/M will prompt you for a
"YES/NO" before executing the command.

Although DIR, REN, and ERA are resident utilities, they are
"bare bones" versions.  They have all have advanced features
that require too much memory to keep in RAM.  If you try to
use one of these features, you must have the corresponding
".COM" file on disk.  For example, place any disk except the
CP/M system disk in the drive and enter

A> dir [full]


You will get the message "DIR     COM required".  The
advanced [full] option requires LOADing DIR.COM.  Now place
the CP/M system disk in the drive and re-issue the command.
An easy way to repeat a command on the C128 is to tap the
CURSOR DOWN key next to the SHIFT key, not the one at the
top of the keyboard.  The last command entered will be
retyped on the screen.  Press RETURN to execute it, or use
the cursor and DEL keys to change it.

You should now see a much more complete directory listing.
The files are listed in alphabetical order, and their sizes
in bytes and records are shown. The sizes will be in 1K
increments for single sided disks and 2K for double sided.
CP/M records are 128 bytes each.  The attributes of each
file are shown, either DIR or SYS and either RW for "read or
write" or RO for "read only".  RO files cannot be changed
without changing them to RW with the SET.COM utility.

The [full] option also shows total bytes used and free on
the disk, total files found and directory entries used.
Long files may take up two directory entries.  You can see
the same display on a disk that doesn't have DIR.COM by
typing

a> dir [drive=b]

Place the disk containing DIR.COM in drive A and the disk
you want to view in drive B.  If you have only one drive,
replace the "b" with "e".  CP/M will LOAD DIR.COM and prompt
you for the new disk.

The last resident utility, TYPE, allows you to look at files
on your screen and print them on a printer.  All files on a
CP/M disk are either ASCII (text) files or binary machine
code files.  You can only use TYPE with ASCII files.  You
can't harm anything if you accidentally use TYPE on a binary
file, but you'll only see gibberish on the screen, and CP/M
may crash.  If that happens, just re-BOOT the system.

Any file with ".DOC", or ".TXT" extensions can usually be
viewed with TYPE.  If you have a file named readme.tex on 
a disk, enter

A> type readme.txt

CP/M will display part of the file README.TXT on the screen.
When the screen is full, a prompt will appear to press
RETURN (almost any key will do), and more of the file will
be displayed.  If you want to exit TYPE, just press CTRL-C.

You can print a text file on your printer by pressing CTRL-P
before issuing the TYPE command.  CTRL-P toggles the printer
on line, and anything that appears on the screen will be
printed as well.  The CTRL-P command produces a tone when
the printer is toggled on.  Pressing CTRL-P again toggles
the printer off and no tone is heard.

While CTRL-P gives you hard copy from TYPE, it also has all
those "Press RETURN..." prompts in it.  You can avoid them,
by using an advanced TYPE option.  Enter

A> type readme.txt[nopage]

The file will scroll up your screen without stopping, and
will print completely.  Since [nopage] is a non-resident
feature of TYPE, TYPE.COM must be on the disk for it to
work.  You can use [nopage] on another disk by typing

A> type d:readme.txt[nopage]

where "d:" is any valid disk drive.

There are many other utility options, too many to discuss
here.  You can find out about them in the DIGITAL RESEARCH
CP/M PLUS USER'S GUIDE.  This is part of the package you get
by mailing in the card bound in the CP/M section of the C128
SYSTEM GUIDE that came with your C128.  The Digital Research
documentation is extensive and a great bargain at the
offered price.  However, it was written by computer folks
for other computer folks.  For easier reading, you may also
want to purchase the CP/M PLUS HANDBOOK by Alan Miller.

You should always keep back-up copies of your system disk
and important utilities.  You can copy files with the
utility PIP.COM.  PIP is explained briefly in the C128
SYSTEM GUIDE.  You can also use DIR+.COM found in public
domain.  You can make full disk copies of any single
sided CP/M disk using a C64 or C128 bit or nibble copier or
a dual drive copier program in non-CP/M mode.  You cannot
use any program that uses BAM or directory references to
copy a disk. [Fast hack-em, and Mavrick do an excellent job.]

Commodore put some excellent features in CP/M on the C128.
The information on how to use them, as well as many of the
regular CP/M commands, can be found in a "HELP" file on the
disk that came with your computer.  HELP.COM is a CP/M
utility that uses special text files with ".HLP" extensions.
The text file is organized alphabetically by subjects and
may contain several levels of subtopics on each subject.

Entering "HELP" at a system prompt will give you a list of
the subjects available.  Be sure that both HELP.COM and
HELP.HLP are on the disk.  Various commands are used to
access the subtopics.  There is a lot of valuable
information specific to the C128 tucked away in the HELP.HLP
file.  The on-screen format is great for browsing through
the information.  But it's not very handy if you need to
check something while you're running another program. [Note:
MS-DOS is just now putting help on DOS 5.0 and 6.0]

You could get a print-out of the HELP screens by using the
CTRL-P option before using HELP.  This will bring your
printer on line and everything displayed on the screen will
be reproduced on paper as well.  All the prompts and your
replies will be there too.  Also, because of the format used
by HELP, only one screen will be displayed on each page,
using quite a bit of paper.  The format will be eighty
columns, not the best if you'd like to three-hole punch your
copy for binding. 

To help you have the best access to this file, we've created
a version formatted for printer output.  It comes with page
numbers, and a table of contents.  It has wide margins
making it easy to put notebook holes on either side. The
HELP file, and a similar one for the CONFigure utility used
with the December 6th operating system, are available in the
public domain.

With the neat spacing and margins, this file is quite long.
This is a common problem with text files.  They often
contain redundant spaces and extra lines, making for good
print-out, but inefficient storage.  A solution devised
years ago by CP/M users is to compact or "squeeze" text
files for storage on disk.

If you look at a CP/M disk directory, you'll likely see
several files that have "Q" as the middle character in their
extensions...FILE.TQT, or DISKDOC.AQM, for example.  The "Q"
indicates that this file has been squeezed.  It cannot be
viewed by TYPE, or handled in the usual manner.  It must be
expanded or "unsqueezed" to it's original form first.

USQ.COM will unsqueeze the HELP and CONF files also on that
disk so you can print hard copy from them.  First format a
new disk using FORMAT.COM.  The unsqueezed version of the
HELP file is 108K long, and will just fit with it's squeezed
counterpart on a single-sided disk.  Using PIP, or DIR+ from
copy the file HELP.DQT to the disk you just formatted. 
Place the disk with USQ.COM in drive A and type

A>USQ

You will get a short message including the address of the
author of the program.  USQ.COM and two companion programs
are in the public domain, although source code for them and
full documentation is available for a small fee.

When you see the "*" prompt, place the disk with HELP.DQT in
drive A and type

*HELP.DQT

USQ.COM will analyze the file and produce an unsqueezed
version.  This will take some time, you may want to have a
good book handy.

When USQ.COM has finished, take a look at the disk
directory. HELP.DQT will still be there, but HELP.DAT has
been added. To get your hard copy, set up your printer with
continuous form paper and place a disk with the December 6th
operating system in drive A.  If you have a non-Commodore
printer and an interface that allows a transparent mode,
type

A>CONF PRT1=ASCII

This changes CP/M so that it sends true ASCII codes rather
than PetASCII to your printer.  If you have a Commodore
printer, skip this step (a few of the special characters in
the file may not be reproduced correctly by your printer).

Now type

A>TYPE E:HELP.DAT[NOPAGE]

But don't press RETURN yet.  If you have two disk drives,
use "B:" in place of "E:".  After you've entered the line,
hold the CONTROL key and press "P".  You should hear a bell
chime, indicating that the printer is now on line.  Now
press RETURN, and the file will be sent to your printer. The
document is 58 pages long, so have enough paper ready. Don't
forget to type CTRL-P again when you're through, or your
screen display will still be echoed on your printer. Follow
the same procedure to make a copy of CONF.DQT.

After you've collected several CP/M disks, you'll have a
number of "Q" files, and you may not remember what they all
contain.  Or you may want to examine a new "Q" file before
bothering to unsqueeze it.  QSHOW.COM you see the file on
your screen without unsqueezing it.  To use it, enter

A>QSHOW d:FILENAME

where "d:" is the drive identifier if you have more than
one, or the virtual drive "E:".  After the first part of the
file is displayed, type "?" to see a list of QSHOW commands.

You may have discovered that, as good as Commodore CP/M is,
it still isn't quite the way you want it.  You probably turn
off the 40 column screen to make CP/M run faster and
prevent timing problems in the 1200 baud mode when running
IMP.COM on.  You may prefer faster keyboard response, and use
CONFigure's FEEL command each time you boot the system.

There are several ways to "customize" the system to your
preferences.  We'll look at the traditional way first.

Use PIP or DIR+ to create a system disk with the following
files:

CPM+.SYS (the December 6th version)
CCP.COM
CONF.COM
SUBMIT.COM
DATE.COM
VDE.COM

Place this disk in drive A and enter the video editor by
typing

A>VDE PROFILE.SUB

This sets up VDE to create a file named "PROFILE.SUB".  Be
sure the name correct.  Once you get the flashing cursor in
VDE enter the following three lines exactly as shown:

CONF 40COL=OFF, FEEL=0
DATE SET
DATE C

Save this file to disk by pressing the ESCape key followed
by "X".  When you get the system prompt, re-boot the
computer.  You can do this by pressing the "reset" switch
next to the power switch.  But a simpler way is to hold
CONTROL and press the "ENTER" key on the numeric keypad.

You should see the system start up normally.  But as soon as
the prompt appears, the first line of PROFILE.SUB will be
printed on the screen.  CP/M then executes the line just as
if you had typed it.  When the "DATE SET" command is
executed, you'll be prompted for the date and time.  The
last command causes the date and time to be displayed
continuously until you press a key.

When CP/M boots, it looks for a file named "PROFILE.SUB". If
one exists, SUBMIT.COM is loaded and the commands in
PROFILE.SUB are executed.

Experiment with various other commands in PROFILE.SUB.  If
you have a color monitor, you can change screen and
character colors.  You may prefer to have your printer port
default to ASCII.  Check the CONF.DAT file or type "CONF" by
itself to see what other things about CP/M you can change.

One of the advantages of having an operating system in RAM
is that it can be changed.  By making these changes to the
system programs on disk, you can have your customized
version available as soon as it loads.  This is much faster,
easier, and more permanent than making changes to the C64
and C128 ROM based operating systems.

Commodore has provided KEYFIG.COM, a very powerful utility
to make changes in CP/M.  You should have good hard-copy of
the HELP file for KEYFIG.  If not, place the disk that came 
with your C128 in drive A, making sure that the side containing
HELP.COM and HELP.HLP is "up".  Remember that you must "flip"
this disk over to read the other side, even on a 1571 drive.
Now type

A>HELP KEYFIG

KEYFIG.COM changes the characters represented by the keys on
your keyboard.  Most of the keys have four "definitions"
because there are four keyboard "modes".  The regular mode
produces lower case characters when you press the alphabet
keys.  The "shifted" mode produces upper-case letters or the
characters that appear on the top of the key...a shifted-1
is a "!", for example.  "Commodore" mode is entered by
tapping the Commodore logo key at the bottom left of the
keyboard.  It works like the "CAPS LOCK" key in C128 mode,
producing upper case letters, un-shifted characters for
other keys.  Typing "1" produces a "1" in Commodore mode.

"Control" mode is produced by holding the CONTROL key and
pressing another key.  CTRL-M produces a carriage return.
Some CTRL characters are used with CP/M files; CTRL-Z is
used to end text files.  Others have special meaning to the
C128's CP/M system.

With KEYFIG.COM, you can change any or all of the character
definitions associated with nearly any key on the keyboard.
For some keys, such as the function keys (F1 through F8),
you can print whole strings with a single keystroke.

Let's walk through a sample KEYFIG session.  First, be sure
you are working with a COPY of the operating system. NEVER
make changes to the original!  Use PIP or DIR+ to copy
CPM+.SYS and CCP.COM to a new disk before you try any KEYFIG
experiments.  The disk you made to test PROFILE.SUB last
time will do nicely.

If you've owned a C64, you probably aren't used to those
four cursor keys at the top of the keyboard.  Since the
"normal" cursor keys work in C128 mode, it makes sense that
they should in CP/M too.  But they don't.  Programs like
dBASE II, WordStar and VDE get downright grumpy if you don't
use the upper cursor keys.  Let's fix that.

KEYFIG.COM will walk you through the key changing process,
but it uses those darn upper cursor keys to do it.  In order
to make the lower keys do what we want, we need to know the
"key codes" for the upper cursor keys. Fortunately there's
an easy way to get them.

Press these three keys all at the same time:

CONTROL
RIGHT-SHIFT (just below the = sign)
CURSOR LEFT (the one above the CLR-HOME key)

A colored square or "window" will appear on the bottom line
of your display.  Now press the CURSOR UP key, the one just
above the  -  key.  You should see "05" appear in the
window. Press RETURN, then press the same three keys again
and get the value for CURSOR DOWN.  These are the
"hexadecimal" values assigned to each key by the CP/M
system.  Here are the values for the keys we're interested
in:

Upper Keyboard              Lower Keyboard

CURSOR UP     -  05         Cursor Up     -  17
CURSOR DOWN   -  18         Cursor Down   -  17
CURSOR LEFT   -  13         Cursor Left   -  01
CURSOR RIGHT  -  04

We're going to change the definitions for the lower "normal"
cursor keys so they are the same as their upper keyboard
counterparts.  But the default values of these keys are
useful too.  The Cursor Up/Down key will reprint the last
command we entered, and the Cursor Left will move back over
that command to let us edit it.  We'll keep these functions
by assigning them to the F1 and F2 keys.

Type KEYFIG at a system prompt, be sure that KEYFIG.COM is
on the disk in your drive.  Answer "N" to the prompt for
instructions.

You'll be asked for the source for the keycodes.  Use the
upper cursor keys and RETURN to select "default
definitions".  At the next menu, select the "edit a key"
option.  You'll see the names of the four key modes on the
screen.  Press the "A" key.  The four values assigned to
that key by the default definitions will appear.  Try other
keys to see the effect.  Some keys, such as F3, have strings
defined in some modes, but not in others.

First let's change the F1 key.  Press F1, then use the
cursor keys and RETURN to select the "normal" mode.  A new
menu will appear.  Use the cursor keys and RETURN to select
the "assign hex value" option.  We want F1 to repeat the
last CP/M command.  This was done by the Cursor Up/Down key,
which had a value of 17.  Type "17" and RETURN.   The value
"17" now appears opposite the "normal" label for F1.

Next move to the "shifted" mode for F1, and use the "assign
hex value" option to give it a value of "01".  This
corresponds to the Cursor Left editing mode for making
command line changes.  Since a shifted F1 is "F2", we've
just made F2 the editing key.

Next press the Cursor Up/Down key at the bottom of the
keyboard.  Change it's "normal" value to "18" and it's
"shifted" value to "05".  These numbers correspond to the
codes used for CURSOR DOWN and CURSOR UP on the upper
keyboard.  Use the same method to change the "normal" Cursor
Left/Right value to "04" and it's "shifted" value to "13".

Now use the cursor keys to select "done editing". You'll be
asked if you want to save the changes as current definitions
or to the CP/M boot disk.  Pick the "boot disk" option, but
BE SURE that your copy of the system disk is in the drive
and NOT the original.

After the disk access is done, exit from KEYFIG and boot the
system using CTRL-ENTER.  Type the following line, but don't
press RETURN:

A>VDE TEST.TXT

Using the INST-DEL key, delete the line back to the prompt.
Now press F1.  If all went well, the command should
re-appear.  Shifted F1 should take you back to the left into
the command for editing.  With the command intact, place a
disk containing VDE.COM in the drive and press RETURN.

Once inside VDE, type a few lines.  Move around in the
document using the lower cursor keys, just as you would on a
C64.  They should behave the same as the upper cursor keys.

KEYFIG has far too many possibilities to discuss here. These
simple cursor key changes should get you started.  Use the
HELP KEYFIG file to explore the other possibilities.

The Commodore CP/M system will even allow you to change key
definitions within other programs.  To see how this works,
boot the system using an unmodified CP/M and enter VDE. Type
a few lines and try to move the cursor up with a shifted
Cursor Up/Down key.  Now press the magic
CTRL/RIGHT-SHIFT/CURSOR LEFT combination.  VDE will pause
and the window will show up on the bottom screen line. Hold
a shift key down and press Cursor Up/Down.  A "17" will
appear in the window.  Now type "05".  The numbers will also
appear in the window.  Press RETURN, and VDE will resume
operation.  Now try the shifted Cursor Up/Down!

Early in this series, we recommended that you use the
operating system dated December 6th [or May 87]. This version
is available from many sources including Commodore.  At that
time, most of us had received the August 1st system disk with
our computers.  Here are some of the advantages of the December
6th version:

The user port is supported, allows a modem to be used.
Audible key-click when keys are depressed.
Supports ASCII as well as Commodore printers.
Supports dual disk drives on serial bus.
Auto repeat for keys, user variable rate.
Allows for easy customization using the CONF.COM utility.

However, don't discard your August 1st operating system just
yet.  The user port support has its drawbacks in some
applications.  Most CP/M computers expect any
self-respecting RS232 port to have a piece of hardware known
as a UART (Universal Asynchronous Receiver/Transmitter).  A
UART gets serial input from outside and collects it into
parallel information for the computer's use.  It reverses
the process for computer output.  Commodore does not use a
hardware UART.  Instead, this process is performed by the
operating system.

That means that the CP/M system must frequently check the
user port to see if a bit of serial data has arrived, and if
so assemble it with other bits to make a parallel data
"byte". How often the user port is checked depends on the
transmission rate, or "baud" rate.  This process goes on,
even if you're not using a modem or other RS232 device. Each
time the system checks the user port, it stops running
programs temporarily.  Although the user port check is fast,
anything done 600 times a second (at 300 baud) takes some
time away from the task at hand.

To see just how much time can be lost, try this experiment
with the December 6th system.  Find a medium sized text
file, one of these articles will do.  Type

A>TYPE filename[NOPAGE]

TYPE.COM must be on your default drive.  The file will print
to the screen without stopping.  Time it with a stopwatch or
sweep second hand.  Now enter

A>CONF BAUD=1200

and use TYPE again to display the file.  Now use CONF to
change the baud rate to 75 and time the file display again.

You'll find that lower baud rates cause the listing to fly
by on the screen.  They also make the keyboard less
responsive, since lower baud rates mean fewer user port
checks and the keyboard is checked at the same time.

Now try booting the August 1st system and TYPE the file (the
CONF.COM utility won't work with the 8/1 system).  You
should see a slightly faster listing than the default
December 6th version, but with no loss of keyboard "feel".

If you are using a modem, you must use the 12/6 system.  If
you run a program that does a lot of calculations or other
internal workings, use the 12/6 system but lower the baud
rate.  If you can get by with no modem and PetASCII printer
output, you may find the 8/1 system your best bet.  I use
the 8/1 system with dBase II, and the 12/6 system with most
other programs.

Next time we'll look at the most popular method of
distributing CP/M public domain files, "libraries".  We'll
also discuss library utilities and use one to "de-library" a
marvelous public domain database.

If you've tried to locate CP/M software, you know that it's hard
to find.  CP/M is an old operating system, and few new programs
are being written for it.  There are a great many programs in
public domain for CP/M.  If you live in an area with a CP/M BBS,
you can download these programs via modem.  You'll find that most
of the files have a ".LBR" extension.  These are "library file"
and cannot be used without "dissolving" the library into its
component programs.

Although using "library" files is relatively new to Commodore
computers, it's been around CP/M a long time.  All CP/M systems
save files on disk in groups called blocks.  Don't confuse this
with the Commodore term; we sometimes use "block" instead of
"sector" when talking about 1541 type disks.  The CP/M blocks may
be 1K, 2K, or even larger, depending on the disk format in use. 
All files are saved in increments of one block.  So, if you have
a double-sided 1571 CP/M disk and store a 2000 character file on
it, the file will occupy one 2K block.  If you save a file with
only one character, it will still take up one 2K block on the
disk!

Most CP/M files in the public domain are composed of several
parts: the source code (which we'll explain later), some
documentation (usually squeezed to save space), and the ".COM"
files themselves.  Since older CP/M systems didn't have much
program memory, programs are often split into separate sections
and loaded from disk individually.  Each of these files will take
up at least one 2K block on a disk.  This would be very wasteful
of space on a BBS or a public domain library disk.

The library system links all the files together into one large
file.  This makes for compact storage.  It's convenient for
exchanging programs because all the support files are
automatically included.  To dissolve a ".LBR" file, you'll need a
library utility, such as NULU15.COM.

NULU15 is actually version "1.5" of the New Universal Library
Utility.  Computer folks often use a number to indicate the major
revision of a program, and a second number separated from the
first by a period to indicate minor revisions.  Since the "." is
an illegal character in CP/M file names, "1.5" has become "15". 
To use the program, type

A> NULU15

NULU will load, then check for any library files on the disk on
the default drive.  Then the free space on drive A
is displayed, followed by the prompt

-Open a library A0:>

The copyright notice displayed insures that no one can sell
NULU15.  It is in the public domain as explained in the
documentation file.

All of NULU's commands begin with a "-".  To see the menu of
commands, type "-H".  We won't discuss most of the commands here.

In order to dissolve a library (NULU uses the term "extract"), we
first must open it.  Since NULU has its "open a library" prompt
already displayed, simply type 

> FREEBASE

Note that the ".LBR" is unnecessary.  If the library you want to
extract from is on another disk, type

> -U d:

instead, where d: is the drive your file is on.  If you misspell
the library file name, NULU will ask if you want to create the
library.  Just press RETURN, and re-enter the name correctly. 
When NULU opens the library, it shows you how many files it
contains.  FREEBASE has nine files.  To see what they are, type

>-L

The names of the files in FREEBASE will be displayed, along with
their extensions.  The numbers following each file name need not
concern us here, but are explained in the NULU15 documentation
file.  You can now extract any of the files with the "-E"
command.  For example, to extract the FREEBASE.DOC file, type

-E FREEBASE.DOC

In some libraries, the files will be squeezed to save even more
disk space.  These files will have a "Q" as the middle letter of
their extensions.  You can unsqueeze and extract these files at
the same time by using the "-Q" command instead of "-E" above. 
To extract and unsqueeze all files from a library, type   

-Q *.*

If you precede the file name with a drive designator, NULU will
place the extracted file on a different disk. This will often be
necessary since the set of extracted files may not fit on the
same disk as the library.  If you have a formatted empty CP/M
disk, extract all the FREEBASE files to it by entering

-E d:*.*

You don't need the "-Q" command, since none of the FREEBASE files
is squeezed.  If you have only one disk drive, use "E:" as the
drive identifier.  You'll be prompted to swap disks by the CP/M
system.  If you don't have a disk handy, use the "-X" command to
exit NULU, and use FORMAT.COM to prepare one.  Then extract the
FREEBASE files.

FREEBASE is a small free-form database system designed by David
Brown.  I've removed a few bugs and adapted it for the C128
terminal commands.  The system allows you to create records of up
to 127 characters each.  No fields are used within the records,
what you type is up to you.  Each record is numbered by the
system.  When you want to search for information, you use the
SEARCH command at a system prompt, followed by the name of the
file to be searched, followed by one or more words to search for.
 

One of the FREEBASE files is a file called DEMO.FBR.  This file
contains several sample records to demonstrate FREEBASE.  To see
how SEARCH works, be sure you're at a system prompt and type

A> SEARCH DEMO.FBR kemp

The DEMO.FBR file contains a catalog of several articles from
INPUT.  The search string asks for all the records that contain
"Kemp".  So, all the articles by Phil Kemp will be displayed on
the screen.  It's best to use only lower case letters in your
search string.  SEARCH will then find any lower or upper case
matches.  If you want to look for articles by either Kemp or
McGuire, enter both names, but separate them with a "pipe"
symbol.  This is produced on the C128 by holding the CTRL key
while pressing the "up arrow" key (the one next to RESTORE, not a
cursor up key).

One of the advantages of FREEBASE is its lack of structure.  You
can store anything in a record, mixing data of all types together
in one file.  For example, try

A> SEARCH DEMO.FBR fred

You'll find Fred"s name in a file of January birthdays (his is
the 3rd), and also in his own file with address and other data. 
If you'd met the fictional Fred at a user group meeting, you
might have entered this information about him.  Later on, you may
have forgotten all about Fred's interest in Multiplan.  But now
you need to import some data from the IMB-PC at work to use in
Multiplan on your C128.  To see if you have any information in
your database that might help, type

A> SEARCH DEMO.FBR multiplan

You'll find that Phil Kemp wrote an article on this very subject
in the March '86 issue of INPUT.  But Fred's record also appears
since he is a Multiplan user. He may be able to help you with the
project.  This mixing of data types gives you some powerful ways
in which to locate and use information.  SEARCH can locate any
record based on a word or words anywhere in the file.  It can
even search several database files, either by specifying them
individually after typing "SEARCH", or by using the "*" wild card
character.  

A> SEARCH d:*.dat joystick

will look for the term "joystick" in all files on drive "d:" that
have a ".DAT" extension.  You can print the records found by
using the CTRL-P command after you enter the SEARCH command, but
before pressing RETURN.  You can change the entered records by
using RANDOM.  The FREEBASE.DOC file explains how to do this.

NULU15 has several other options which are described in the
documentation file NULU15.WS.  The ".WS" extension identifies a
WordStar file.  WordStar is a very popular CP/M word processor. 
It is a commercial program by MicroPro and is NOT in public
domain.  WordStar is expensive and not very user friendly.  So
many special commands are required that the program comes with
glue on key cap labels to help you remember which keys to push. 
WordStar also creates files that have imbedded command codes that
can raise havoc with printers if a TYPE command is used to try to
print hardcopy from them.

Fortunately there's an easy way to print WordStar files for those
who don't own the program.  FILT7.COM, which gives you the options
of filtering out all the WordStar codes, while retaining it's form
feed commands.  To get a good hard copy of the NULU15 documentation,
use PIP to copy NULU15.WS to a fresh disk, then type

A> FILT7 d:NULU15.WS d:NULU15.DOC

Answer the prompts "T" for text, "1" to remove the WordStar dot
commands, and "Y" for tabs.  You can use the TYPE command with
the [NOPAGE] option and CTRL-P to get a hard-copy of the filtered
file NULU15.DOC.  Or you can use LISTT get a left hand margin and
page numbering.  Be sure to respond "Y" to the form feeds prompt
in LISTT.

Last time we looked at "library" files.  Libraries are used to
store several related programs in one large file.  This may be
done to hold a set of programs together on a BBS or in a user
group library.

Libraries are also used to save disk space.  CP/M stores programs
in large increments called "blocks".  If you store many short
programs on a disk, you may lose several thousand bytes in the
process.  Collecting all the small programs into one library file
can recover most of the unused disk area.

Using a utility such as NULU15.COM you could extract any program
you needed from the library.  But this would be an awkward procedure
for any programs you need often. The program LRUN23.COM, allows you
to run a program in a library file without extracting it.  The
demonstration file COMMAND.LBR contains the programs ENTER.COM,
SEARCH.COM, and RANDOM.COM from the FREEBASE library.  To test
LRUN23, be sure that the file DEMO.FBR from the FREEBASE library
is extracted and available on the same disk.  Then type

A> LRUN23 SEARCH d:DEMO.FBR mcguire

The first command loads and executes LRUN23.COM.  LRUN23 looks
for a library file name.  Not finding one, it uses the default
name COMMAND.LBR.  It looks through the library for SEARCH.COM,
and executes that program.  SEARCH then looks on drive "d:" for
the file DEMO.FBR and displays all the records in that database
which contain the name "McGuire".  Except for the "LRUN23" part,
this is the same type of command we used last time to execute
SEARCH after extracting it from the library.  By using LRUN23, we
can avoid extracting SEARCH.COM.

To see the other options available, type

A> LRUN23

with no other commands.

One of the benefits of CP/M is the availability of computer
languages that run under it.  Excellent implementations of Forth,
Pascal, Fortran, Prolog, C, and many others are in the public
domain.  These are often more complete versions than those
available for Commodore mode.  Working with these languages is a
bit different than programming in BASIC on the C128, however.  In
most cases, you use an editor of your own choosing to create
"source code".  Then a program called a "compiler" creates an
executable program from the text file you wrote.  

You can use the VDE editor from to examine one of the source 
code files. Type

A> VDE d:ENTER.ASM

This file is the source code for ENTER.COM.  It is written in
assembly  language for the 8080 microprocessor.  As you browse
through the file, you'll find comments used extensively.  If
you're familiar with 6502 machine code, you'll be able to figure
out much of this program.

Near the end of the file, you'll find the screen display messages
and the cursor positioning commands.  These commands would have
to be changed by others who use the program on different
computers.  For this reason, CP/M public domain programs are
often supplied in source code.  Creating an executable program
from a machine language source code file is called "assembly" and
the program that does it is called an "assembler".

We can't give you all the information you might need to make
changes in source code.  But we will show you the procedure to
assemble any ".ASM" files you find.

First, look for files labeled ".OBJ", or ".BIN".  Use the rename
utility to change this extension to ".COM" and try executing the
file.  If this works, you don't need to assemble the
corresponding ".ASM" file.

To assemble a ".ASM" or ".MAC" file, you'll need MAC.COM.  This
program, and several others, are available from Commodore.  To
get them, mail in the card bound in the CP/M section of the
User's Guide that came with your C128.  MAC.COM is a commercial
program, not public domain. 

If the file extension is ".MAC", use rename to change it to
".ASM".  The ".MAC" extension is there to tell you that MAC.COM
is required to assemble this file.  The older ASM.COM cannot be
used on ".MAC" files.  Now type

A> MAC d:filename    

MAC.COM will create a file called "filename.HEX".  This is the
assembled code in a special format devised by Intel Corp.  Early
CP/M machines used paper tape for storage.  The tape was limited
to seven bit ASCII.  Machine code instructions need eight bits. 
Intel solved this problem by storing each eight bit number as two
hexadecimal ASCII codes.  The ".HEX" file also contains data on
file size and location.  We can now forget about the Intel format
and type

A> HEX d:filename

HEX.COM, which is also on the disk you obtain from Commodore,
looks for "filename.HEX" and converts it to "filename.COM", a
ready-to-execute file.

A similar procedure is used to write programs in other languages
under CP/M.  An editor such as VDE is used to create source code.
 A program is then run which compiles the source code into 8080
machine code, or a psuedo-machine code in some cases.

There is a compiled version of BASIC called EBASIC. Use TYPE
or VDE to look at the files READ.ME and EBASIC.DOC which
explain EBASIC in detail, and tell you how to compile source
code.  A demo program, both source code and compiled versions,
shows you some of the commands.  If you're familiar with
Commodore BASIC, you should be able to write programs using
EBASIC easily.  You will have to compile the source code each
time you want to "run" the program after making a change.

In this series we've introduced you to the basic concepts of
CP/M.  We've given you enough information to get the system
operating, and a few programs to use.  But we've just scratched
the surface.  There's much more you can do with CP/M.  For
further information, check the references listed at the end of
the first article in this series.

All of these articles, and all the public domain programs we've
discussed, are available on a set of four CP/M disks from the
C128.HSG c/o Gary J. Stagliano 182-J Homestead St. Manchester,
CT 06040 203-647-8187

